It is known in data processing systems to provide one or more resources for processing transactions issued by master devices within the system. An example of such resources would be one or more slave devices provided for performing operations in response to transactions issued to them by master devices within the system. The slave devices can take a variety of forms, and one example would be a memory controller used to handle read and write accesses in respect of an associated memory based on read and write transactions issued by various master devices within the data processing system.
Often the resources provided for processing transactions are shared between multiple sources of transactions. For example, in System-on-Chip (SoC) systems, it is known for multiple master devices to share the system resources. Wherever there are such shared resources, there will typically be one or more arbitration points along paths interconnecting the master devices and the shared resource, such arbitration points incorporating arbitration circuitry for applying an arbitration policy in order to arbitrate between multiple pending transactions issued to the same shared resource. Accordingly, the proportion of a shared system resource allocated to each master will be determined by the arbitration policy. The performance of the individual masters will in turn depend on the share of the system resources that they obtain.
There are a number of known types of arbitration policy. For example, a fixed arbitration policy may be applied, but with such an approach the share of the system resources that any particular master obtains depends on the activity of the other master devices, which will vary over time. Hence, such fixed arbitration policies will provide performance for any particular master that is dependent on the activity of other masters in the system. For a master device that has a specific task to perform in a particular period of time (for example a graphics processing unit that needs to process a frame's worth of graphics data within a frame period), a fixed level of system resource is required. However, with a fixed arbitration policy it is not possible to fix this level of system resource, so either the master is arranged to receive excess system resource to no overall system benefit, thus depriving other masters of this resource, or instead the master receives insufficient system resource and is unable to complete the specific task in the time allowed. In many systems, the latter scenario is not acceptable, and hence it is often the case that the arbitration policy is set to provide sufficient access to system resources under worst case conditions, which means that under normal operating conditions some master devices are receiving greater access to the system resources than they need, thereby depriving other masters of opportunities to improve their performance.
Some known arbitration policies, such as a weighted round-robin arbitration policy, partition the available bandwidth between the masters such that they are all guaranteed a minimum bandwidth under all operating conditions. However, such a policy must allocate a master a larger share of the shared system resource than would typically be necessary to achieve its minimum bandwidth, which will have the effect of increasing the latency of other masters in the system, with a corresponding reduction in the performance of those other masters.
The article “A Quality-of-Service Mechanism for Interconnection Networks in System-on-Chips” by W Weber et al, Sonics, Inc, 1530-1591/05 $20.00 © 2005 IEEE, describes an arbitration mechanism for arbitrating between several initiators seeking to access a single shared target via an interconnect. The described solution breaks arbitration for the target into two parts, namely arbitration in the core of the interconnect to deliver requests from different initiators to the target, and arbitration at the edge of the interconnect to enforce bandwidth allocations for different initiators. Threads (also referred to in the article as virtual channels) leading to a target can be assigned one of three quality-of-service levels, namely priority threads, bandwidth threads and best-effort threads. Priority threads are optimised for low-latency service, bandwidth threads receive throughput guarantee within fixed jitter bounds, and best-effort threads receive service if and when bandwidth is left over by the other threads. Priority threads and bandwidth threads have a certain absolute target bandwidth allocation associated with them. As long as priority threads request service at a rate lower than their allocation, they receive absolute priority. Similarly, as long as bandwidth threads request service at a rate lower than their allocation, they are serviced ahead of best-effort threads. However, when either priority threads or bandwidth threads request service at a rate greater than their allocation, they are demoted to become best-effort threads.
Hence, by such a mechanism, the higher priority threads are demoted if they start to request service at a rate greater than their bandwidth allocation. However, when employing such an approach, the quality-of-service levels assigned to particular threads will, by virtue of the scheme used, be higher than absolutely necessary to enable those threads to achieve their desired tasks, thereby reducing the performance potential of other masters within the system, such as central processing units (CPUs).
Accordingly, it would be desirable to provide an improved technique for arbitrating access to a shared resource by transactions issued from a plurality of sources within a data processing apparatus.